剛開始先放圖

在寫Lambda函數的時候,看見了[&],[=],[x],[&x],突然想起,這可能是一個不錯的Pointer切入點,所以今天就用Lambda來開啟Pointer之旅喇。
還記得當lambda寫在main()中間大概是什麼樣子嗎?
大概是這個樣子
int main(){
auto a = 0;
//這行讀取a並將他回傳給b
auto b = [a](){
return a;
};
//&可以讀寫a
//也就是說可以更改a
//所以現在 a 是 1
[&a](){
a++;
};
}
&a可以寫入變數,而a就是只讀變數,這個功能就叫做這個特性也同樣適用於__小括號變數__,如
//這個方法可以讀寫a
auto add = [](auto &a){
a++;
};
int main(){
int a = 0;
add(a);
//現在變成 a
}
a
甚至__普通函數__都可以,但需要註明型別
auto add(int &a){
a++;
}
int main(){
int a = 0;
add(a);
//現在a變成1了
}
但是,下面的函數也能做到一樣的效果
auto add(auto a){
a++;
return a;
}
int main(){
int a = 0;
a = add(a);
}
return回傳statement,而且有第二課講過的=傳入符號。(忘記的朋友可以去Day2複習)return捕捉了假a在function裏最後的數值也就是a++,並回傳 1這個數值=傳入1給真a。
auto add(auto a, auto b){
a = a+b;
return a;
}
int main(){
auto a=0,b=4;
a = add(a, b);
}
return 的作用就是把a+b這個運算結果返回,而剛好函數裏的 a 儲存著這個a+b的運算結果而已。採用這個方法,當數值a改變數值時,數值b也可以跟著改變,變得一樣,以下是syntax
//這是同步的syntax
//第一種狀態
&a = &b;
//這是第二種狀態
&a = &b;
//例子
auto a = 10;
auto b = 5;
&a = &b;
cout << a << " " << b << endl;
a = -3;
if(a == b){
cout << "a 和 b 現在都是一樣的,都是 " << b << endl;
}else {
cout << "a 和 b 是不同的, a 是" << a << ",b是" << b << endl;
}
//輸出
5 5
a 和 b 現在都是一樣的,都是 -3
雖然文章不長,但大家已經學會Pointer的基本概念了。
大家可能覺得奇怪,為什麼今天沒有說Pointer中最有名的*呢?因為Pointer除了是一個概念,也可以是一個自動內存管理的資料結構,而普通變數的指針應用和Pointer中的指針應用有不少相似之處,所以我就先讓大家理解普通變數的部分。